package br.com.games.hefesto;

import java.util.ArrayList;
import java.util.List;

/**
 * Gerenciador de partidas
 * 
 * @param <H> Tipo usado para manter o estado do jogo
 * @param <M> Objeto que pode ser lancado durante o jogo
 * 
 * @since 2013
 * @author <a href="mailto:fernando.schindler@gmail.com">Fernando Schindler</a>
 */
public class Hefesto<H extends State, M> implements Runnable {
	
	/**
	 * Criar um novo gerenciador de partidas
	 * @param game Jogo a ser controlado
	 */
	public Hefesto(Game<H, M> game){
		this.game = game;
		this.move = new ArrayList<MoveListener<M>>();
	}
	
	/**
	 * Adicionar um controlador de movimentos
	 * @param listener
	 */
	public void addMoveListener(MoveListener<M> listener){
		this.move.add(listener);
	}

	/*
	 * (non-Javadoc)
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		/**
		 * Ir para o estado inicial
		 */
		this.game.reset();
		
		while (this.game.isRunning()){
			Player<H, M>
			currPlayer = this.game.getCurrent();
			
			Move<M> m = currPlayer.getMove(this.game);	
			
			if (null != m){
				this.game.perform(m);
				
				for (MoveListener<M> l : this.move){
					l.onMove(m, currPlayer);
				}
			}
			
			if (this.game.isGameOver()){
				this.game.showWinner();
				this.game.reset();
			}
		} 
		
		this.game.exit();
	}
	
	/**
	 * Campos privados
	 */
	private Game<H, M> game;
	private List<MoveListener<M>> move;
}
